/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import dao.ComandaCabecalhoDAO;
import dao.ComandaDetalheDAO;
import dao.ProdutoDAO;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import model.ComandaCabecalho;
import model.ComandaDetalhe;
import model.Produto;
import util.Controller;
import view.JPrincipal;
import view.VendaView;

/**
 *
 * @author Dick developer
 */


public class ControllerVenda implements Controller {
    
    private DecimalFormat df = new DecimalFormat("#,##0.00;-#,##0.00");
    private VendaView vendaView;
    private ComandaCabecalhoDAO comandaCabecalhoDAO = new ComandaCabecalhoDAO();
    private ComandaDetalheDAO comandaDetalheDAO = new ComandaDetalheDAO();
    private ProdutoDAO produtoDAO = new ProdutoDAO();

    public ControllerVenda(JPrincipal jf) { 
        vendaView = new VendaView(jf);
    }
    
    public void iniciaApp(){
        vendaView.setVisible(true);        
        addActionListener();
    }

    // <editor-fold defaultstate="collapsed" desc="Adiciono os enventos para a view">  
    private void addActionListener(){
        vendaView.addTfComandaActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                carregaComanda();
            }
        });
        vendaView.addTfProdutoCodigoActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                carregaProduto();
            }
        });
        vendaView.addTfProdutoQuantidadeKeyListener(new KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                atualizaTotalItem();
            }
        });
        vendaView.addTfProdutoQuantidadeActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                adicionaDetalhe();
            }
        });
        
        vendaView.addTableModelListener( new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent tme) {
                if(tme.getType() == TableModelEvent.UPDATE){
                    atualizaQuantidade(tme);
                }
            }
        });
    }
    // </editor-fold>
    
    private void atualizaQuantidade(TableModelEvent tme) {
                
            try {
                int linha = tme.getFirstRow();
                if( vendaView.getModelo().getRowCount() > 0){
                    ComandaDetalhe detalhe = vendaView.getModelo().get(linha);
                    if(detalhe.getQuantidade() >= 0){
                        if(detalhe.getQuantidade() == 0){
                            // atualiza as linhas da tabela
                            vendaView.getModelo().removeRow(linha);
                            comandaDetalheDAO.Excluir(detalhe);                          
                        } else {
                            comandaDetalheDAO.Atualizar(detalhe);
                        }
                        // atualiza os campos na tela
                        BigDecimal totalVenda = new BigDecimal(0.00);
                        Integer itens = 0;
                        for (int i = 0; i < vendaView.getModelo().getRowCount(); i++) {
                            detalhe = vendaView.getModelo().get(i);
                            totalVenda = totalVenda.add( detalhe.getProduto().getVlrVenda().multiply( new BigDecimal(detalhe.getQuantidade())) );
                            itens += detalhe.getQuantidade();
                        }
                        vendaView.setJlTotalItens(itens.toString());        
                        vendaView.setJlTotalComanda(df.format(totalVenda));
                    }
                } 
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        
    }
    
    private void carregaComanda(){
        ComandaCabecalho cabecalho = comandaCabecalhoDAO.getByComanda(vendaView.getTfComanda(), "");
        if(cabecalho == null){
            JOptionPane.showMessageDialog(vendaView, "Comanda não Encontrada.");
        } else {
            vendaView.setTfCliente(cabecalho.getCliente().getNome());            
            vendaView.preencheDetalheTableModel(comandaCabecalhoDAO.getDetalhes(cabecalho));
            vendaView.abilitaDesabilita(false, true, true);
        }       
    }
    
     private void carregaProduto() {
        Produto produto = produtoDAO.getByCodigoBarras(vendaView.getTfProdutoCodigo());
         if (produto == null) {
             JOptionPane.showMessageDialog(vendaView, "Produto não Encontrada.");
         } else {
             
             vendaView.setTfProdutoDescricao(produto.getDescricao());
             vendaView.setTfProdutoVlrUnitario(produto.getVlrVenda());
         }
         
    }
    
     private void atualizaTotalItem() {
         if(vendaView.getTfProdutoQuantidade().equals("")){
             vendaView.setTfProdutoVlrTotalItem("0,00");
         } else if(vendaView.getTfProdutoCodigo().equals("")) {
             vendaView.setTfProdutoVlrTotalItem("0,00");
         } else {
            String teste = vendaView.getTfProdutoVlrUnitario().replaceAll("\\.", "");
            teste = teste.replaceAll(",", ".");
            
            Double totalItem = new Double(teste);
            
            totalItem *=  Integer.parseInt( vendaView.getTfProdutoQuantidade() );
            

            vendaView.setTfProdutoVlrTotalItem(df.format(totalItem) );
        }
    }
     
     private void adicionaDetalhe(){
         if(vendaView.getTfProdutoQuantidade().equals("")){
             JOptionPane.showMessageDialog(vendaView, "Informar a quantidade!");
         } else if(vendaView.getTfProdutoCodigo().equals("")) {
             JOptionPane.showMessageDialog(vendaView, "Informar um produto!");
         } else {
            ComandaCabecalho cabecalho = comandaCabecalhoDAO.getByComanda(vendaView.getTfComanda(), "");
            Produto produto = produtoDAO.getByCodigoBarras(vendaView.getTfProdutoCodigo());

            ComandaDetalhe detalhe = new ComandaDetalhe(cabecalho, produto, Integer.parseInt(vendaView.getTfProdutoQuantidade()));

            comandaDetalheDAO.Salvar(detalhe);
            vendaView.preencheDetalheTableModel(comandaCabecalhoDAO.getDetalhes(cabecalho));
            
            vendaView.setTfProdutoCodigo("");
            vendaView.setTfProdutoDescricao("");
            vendaView.setTfProdutoVlrUnitario(new BigDecimal("0.00"));
            vendaView.setTfProdutoQuantidade("");
            vendaView.setTfProdutoVlrTotalItem("");
         }
     }
}
